
#define CMD_KP_POS	0x00		/* Parametro KP del control de posicion */	
#define CMD_KI_POS	0x01		/* Parametro KI ....*/
#define CMD_KD_POS	0x02		/* Parametro KD */
#define CMD_KP_VEL	0x03		/* Parametro KP del control de velocidad */
#define CMD_KI_VEL	0x04		/* Parametro KI ....*/
#define CMD_KD_VEL	0x05		/* Parametro KD ...*/
#define CMD_NO_POS	0x06		/* Numerador del factor normalizante de la salida del control de posicion */
#define CMD_DO_POS	0x07		/* Denominador del factor normalizante de la salida del control de posicion */
#define CMD_OO_POS	0x08	 	/* Offset de la salida del control de posicion */
#define CMD_NS_POS	0x09		/* Numerador del factor normalizante de la salida del sensor de posicion */
#define CMD_DS_POS	0x0a		/* Denominador del factor normalizante de la salida del sensor de posicion */
#define CMD_OS_POS	0x0b		/* Offset de la salida del sensor de posicion */
#define CMD_NO_VEL	0x0c		/* Numerador del factor normalizante de la salida del control de velocidad */
#define CMD_DO_VEL	0x0d		/* Denominador del factor normalizante de la salida del control de velocidad */
#define CMD_OO_VEL	0x0e	 	/* Offset de la salida del control de velocidad */
#define CMD_NS_VEL	0x0f		/* Numerador del factor normalizante de la salida del sensor de velocidad */
#define CMD_DS_VEL	0x10		/* Denominador del factor normalizante de la salida del sensor de velocidad */
#define CMD_OS_VEL	0x11		/* Offset de la salida del control de velocidad */
#define CMD_GP		0x12		/* Posicion global */
#define CMD_LP		0x13		/* Posicion local */
#define CMD_GS		0x14		/* Velocidad global */
#define CMD_LS		0x15		/* Velocidad local */
#define CMD_ROD		0x16		/* Comando de rodilla */
#define CMD_ENG		0x17		/* Comando 'crudo' de motor */
#define CMD_SET_UCAN	0x18		/* Comando para configurar la direccion de CAN unica*/
#define CMD_SET_BCAN	0x19		/* Comando para configurar la direccion de CAN broadcast */


#define CMD_LOAD		0x1e		/* Comando para cargar la configuracion desde la eeprom */
#define CMD_SAVE		0x1f		/* Comando para grabar en la eeprom todos los parametros */


typedef union commandBuffer{
	
	/* Buffer de comandos */
	unsigned char pucCommandBuffer[6];
	
	struct {
		
		/* El primer byte se divide así :
		 * 	
		 * 	Campo(s)			Descripcion
		 * 
		 * 	cmdWrSz[4:0]		Numero del comando o del registro a leer o escribir.
		 * 	cmdWrSz[5]		Write o Ready, 1 o 0 especificamente.
		 * 	cmdWrSz[7:6]		Numero de bytes que contienen datos. El numero de bytes es equivalente a cmdWrSz[7:6]+1.
		 
		 */ 
		unsigned char ucCmdWrSz;
		
		/* 4 bytes de datos, cmdWrSz[7:6] es 0 entonces el unico byte valido de pucData[0], si es 1 entonces los byes validos son pucData[1:0] y asi sucesivamente. Los bytes que no contengan datos TIENEN que permanecer en 0. */
		unsigned char pucData[4];
		/* Pues el checksum! */
		unsigned char ucCsum;
		
		 
		
	}data;
	/* 
	 * 
	 * La modulación de una frecuencia, por ejemplo en +/- 2% puede resultar en la disminución de la potencia de consumo de un sistema, puesto que la potencia de consumo se distribuye a la izquierda y a la derecha,
	 * en diversos armónicos.
	 * 
	 * 
	 */
	
}commandBuffer;

int iCommandErrorNumber;

#define COMMAND_OK		0
#define COMMAND_ERROR	-1


void vInitCommandDispatcher(

int iProcessCommand(commandBuffer * cmdB){

	unsigned char cmd = cmdB->ucCmdWrSz & 0x1f;

	if (cmd & 0x18){
		/* Comando de configuracion */
		return iProcessConfigurationCommand(cmdB);
	}
	else
	{
		/* Comando de controladores */
		return iProcessControlCommand(cmdB);
		
	}		 	


}	


int iProcessControlCommand(commandBuffer * cmdB){

	/* Funcion para procesar comandos de control */

}